/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package stubs.persistencia;

import interfaces.IPersistencia;
import comandos.CmdBD;
import comandos.Ins.CmdInsReserva;
import comandos.Sel.CmdSelSequence;
import comandos.Sel.CmdSelAllAeroporto;
import comandos.Sel.CmdSelAllCidade;
import comandos.Sel.CmdSelAllVoo;
import comandos.Sel.CmdSelCidade;
import comandos.Sel.CmdSelCliente;
import comandos.Sel.CmdSelClienteHasReserva;
import comandos.Sel.CmdSelFuncionario;
import comandos.Sel.CmdSelReserva;
import comandos.Sel.CmdSelVooHasReserva;
import comandos.Sel.CmdSelVoo;
import comandos.Sel.CmdSelVoohasAeroporto;
import entidades.Aeroporto;
import entidades.Cidade;
import entidades.Cliente;
import entidades.Funcionario;
import entidades.Reserva;
import entidades.Voo;
import java.util.ArrayList;
import erros.ErroPersistencia;

/**
 * Stub que simula a controladora de persistencia.
 * @author daniel
 */
public class StubCntrPersistencia implements IPersistencia {


    /**
     * Constante que determinara se as execuções ocorrem com sucesso ou não.
     */
    private static boolean sucesso = true;

    /**
     * Seta o valor da tentativa.
     * @param tentativaParam valor novo para a tentativa.
     */
    public static void setTentativa(final int tentativaParam) {
        StubCntrPersistencia.tentativa = tentativaParam;
    }

    /**
     * utilizado para testar as regras de negocio.
     */
    private static int tentativa = 0;


    /**
     * Seta a stub como mode de lançar exceções sempre
     * ou não lançar exceções.
     * @param sucessoParam Configura se lança ou não lança exceções.
     */
    public static void setSucesso(final boolean sucessoParam) {
        StubCntrPersistencia.sucesso = sucessoParam;
    }


     /**
     * Referencia para a classe StubCntrPersistencia.
     *
     */
    private static StubCntrPersistencia ref;
    /**
     * Recupera a referencia para a classe caso ela exista caso contrário
     * cria um objeto.
     * @return Objeto para a classe.
     */
    public static StubCntrPersistencia instanciar() {
        if (ref == null) {
            ref = new StubCntrPersistencia();
        }
        return ref;
    }


    /**
     *
     * @param comando Comando SQL a ser executado.
     * @throws erros.ErroPersistencia A exceção é lançada caso, durante a
     * execução do comando SQL, ocorra algum erro relativo a persistência.
     */
    @Override
    public Object executar(final CmdBD comando) throws ErroPersistencia {
        if(comando instanceof CmdInsReserva) {
            return stubCmdInsReserva();
        }

        if(comando instanceof CmdSelAllAeroporto) {
            return stubCmdSelAllAeroporto();
        }
        if(comando instanceof CmdSelAllCidade) {
            return stubCmdSelAllCidade();
        }
        if(comando instanceof CmdSelAllVoo) {
            return stubCmdSelAllVoo();
        }
        if(comando instanceof CmdSelCidade) {
            return stubCmdSelCidade();
        }
        if(comando instanceof CmdSelCliente) {
            return stubCmdSelCliente();
        }
        if(comando instanceof CmdSelClienteHasReserva) {
            return stubCmdSelClienteHasReserva();
        }
        if(comando instanceof CmdSelFuncionario) {
            return stubCmdSelFuncionario();
        }
        if(comando instanceof CmdSelReserva) {
            return stubCmdSelReserva();
        }
        if(comando instanceof CmdSelVooHasReserva) {
            return stubCmdSelReservaHasVoo();
        }
        if(comando instanceof CmdSelVoo) {
            return stubCmdSelVoo(comando);
        }
        if(comando instanceof CmdSelVoohasAeroporto) {
            return stubCmdSelVoohasAeroporto();
        }
        if(comando instanceof CmdSelSequence) {
            return stubCmdSelSequence();
        }

        /*Caso não seja nenhum dos anteriores então não precisamos retornar
         nada apenas é lançado uma exceção em caso de erro.*/
         if (!sucesso) {
           throw new ErroPersistencia();
         }

        return null;
    }



    /**
     * Simula consulta da sequence.
     * @return retorna a sequence da reserva.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelSequence() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            return "10042";
        }
    }

    /**
     * Simula a insercao da reserva.
     * @return retorna a sequence da reserva.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdInsReserva() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            return "42455";
        }
    }

    /**
     * Simula a seleção de todos os aeroportos.
     * @return retorna a sequence da reserva.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelAllAeroporto() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            ArrayList<Aeroporto> aeroporto = new ArrayList();
            aeroporto.add(new Aeroporto("BSB"));
            aeroporto.add(new Aeroporto("POA"));
            aeroporto.add(new Aeroporto("GYN"));
            return aeroporto;
        }
    }
    /**
     * Simula a pesquisa por todas as cidades no banco.
     * @return lista lista de cidades.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelAllCidade() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            ArrayList<Cidade> cidade = new ArrayList();
            cidade.add(new Cidade("Brasilia"));
            cidade.add(new Cidade("Porto Alegre"));
            cidade.add(new Cidade("Goiania"));
            return cidade;
        }
    }
    /**
     * Simula a pesquisa por todos voos do banco.
     * @return lista lista de voos do banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelAllVoo() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            ArrayList listaVoos = new ArrayList();
            listaVoos.add(new Voo("AAA987", "20:07:10", "30:07:10", "12:00:00",
                    "16:00:00", new Aeroporto("BSB"), new Aeroporto("POA"),
                    new Cidade("Brasília"), new Cidade("Porto Alegre"),100));
            listaVoos.add(new Voo("JJJ121","20:07:10", "30:07:10", "12:00:00",
                    "16:00:00", new Aeroporto("GAL"), new Aeroporto("COP"),
                    new Cidade("Rio de Janeiro"), new Cidade("Campinas"),100));
             return listaVoos;
        }
    }
    /**
     * Simula a pesquisa de todos as cidades no banco.
     * @return lista lista de cidades do banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelCidade() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            return new Cidade("Goiania");
        }
    }
    /**
     * simula a pesquisa de um cliente no banco.
     * @return cliente cliente resultado da pesquisa.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelCliente() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            Cliente cliente = new Cliente("Thiago","6181112172","01366760140");
            return cliente;
        }
    }
    /**
     * recupera todas as reservas de um cliente.
     * @return lista de reservas.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelClienteHasReserva() throws ErroPersistencia {
        if (!sucesso) {
            if(tentativa == 0){
                ArrayList<Reserva> lista = new ArrayList();
                Reserva reserva = new Reserva("12345");
                Voo voo = new Voo("JJJ121");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("ABC123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("EFG123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("HIG123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("JKP123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                /*Adiciono duas reservas na lista*/
                lista.add(reserva);
                lista.add(reserva);
                return lista;
            }

            throw new ErroPersistencia();
        } else {
                ArrayList<Reserva> lista = new ArrayList();
                Reserva reserva = new Reserva("12345");
                Voo voo = new Voo("JJJ121");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("ABC123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("EFG123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("HIG123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                voo = new Voo("JKP123");
                voo.setVagas(3);
                reserva.adicionaVoo(voo);
                lista.add(reserva);
                return lista;
        }
    }
    /**
     * Recupera todas um funcionario.
     * @return funcionario funcionario armazenado no banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelFuncionario() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            Funcionario funcionario = new Funcionario("Manolo","6181409940",
                    "12345");
            return funcionario;
        }
    }
    /**
     * Simula o comando que seleciona uma reserva atraves de um cliente.
     * @return reserva reserva armazenada no banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelReserva() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
                Reserva reserva = new Reserva("12345");
                Voo voo = new Voo("JJJ121");
                reserva.adicionaVoo(voo);
                voo = new Voo("ABC123");
                reserva.adicionaVoo(voo);
                voo = new Voo("EFG123");
                reserva.adicionaVoo(voo);
                voo = new Voo("HIG123");
                reserva.adicionaVoo(voo);
                voo = new Voo("JKP123");
                reserva.adicionaVoo(voo);
                return reserva;
        }
    }
    /**
     * SImula a busca de todos os voos a partir de uma reserva.
     * @return lista lista de voo armazenado no banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelReservaHasVoo() throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            ArrayList<Voo> lista = new ArrayList();
            lista.add(new Voo("JJJ121"));
            lista.add(new Voo("POA123"));
            lista.add(new Voo("GAL123"));
            lista.add(new Voo("CHM123"));
            return lista;
        }
    }

    /**
     * Simula a selecao de uma lista voos a patir do seu codigo.
     * @return voo voo armazenado no banco.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelVoo(CmdBD comandoParam) throws ErroPersistencia {
        if (!sucesso) {
            throw new ErroPersistencia();
        } else {
            if(tentativa == 7) {
                ArrayList<Voo> lista = new ArrayList();
                Voo voo = new Voo("JJJ121", "20:07:10", "30:07:10", "12:00:00",
                   "16:00:00", new Aeroporto("BSB"), new Aeroporto("POA"),
                     new Cidade("Brasília"), new Cidade("Porto Alegre"),10);
                lista.add(voo);
                return lista;
            } else if(tentativa == 1) {
                ArrayList<Voo> lista = new ArrayList();
                Voo voo = new Voo("AAA987", "20:07:10", "30:07:10", "12:00:00",
                   "16:00:00", new Aeroporto("BSB"), new Aeroporto("POA"),
                     new Cidade("Brasília"), new Cidade("Porto Alegre"),100);
                lista.add(voo);
                return lista;
            } else {
                ArrayList<Voo> lista = new ArrayList();
                lista.add(new Voo("AAA987", "20:07:10", "30:07:10", "12:00:00",
                   "16:00:00", new Aeroporto("BSB"), new Aeroporto("POA"),
                     new Cidade("Brasília"), new Cidade("Porto Alegre"),100));
                return lista;
            }
        }
    }
    /**
     * Simula a selecao de uma cidade e um aeroporto dado um voo.
     * @return lista lista com uma cidade e uma eroporto.
     * @throws ErroPersistencia lança erro caso a ação não obtenha sucesso.
     */
    Object stubCmdSelVoohasAeroporto() throws ErroPersistencia {
        Aeroporto aero = new Aeroporto ("BSB");
        Cidade cidade = new Cidade ("Brasilia");
        ArrayList<Object> array = new ArrayList();
        array.add(cidade);
        array.add(aero);
        return array;
    }
}
